package belleza.relativa

import belleza.relativa.security.Role
import belleza.relativa.security.User
import belleza.relativa.security.UserRole
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap

import static belleza.relativa.Persona.*

class PersonaService {

    def redNeuronalOriginalService

    def guardar(GrailsParameterMap params) {
        def personaInstance = new Persona(params)
        personaInstance.cantVotos = 0
        //personaInstance.reputacion = 0

        def role = Role.findByAuthority('ROLE_USER')
        def user = new User(params)
        user.setEnabled(true)
        personaInstance.setUsuario(user)
        def map = ["saved": false, "personaInstance": personaInstance]
        map["saved"] = personaInstance.save(flush: true)
        if (map["saved"]) {
            UserRole.create(user, role, true)
            def fotoInstance = new Foto(params)
            personaInstance.setFotoPrincipal(fotoInstance)
            map["saved"] = personaInstance.save(flush: true)
            if (map["saved"]) {
                def sexo = personaInstance.getSexo() == "M" ? 0 : 1;
                def buscado = personaInstance.getSexoBuscado() == "M" ? 0 : personaInstance.getSexoBuscado() == "F" ? 1 : 2;
                redNeuronalOriginalService.createPersona(user.getId(), sexo, buscado,fotoInstance)
            }
        }
        return map
    }

    /*
   * Devuelve todas las conversaciones que no estan borradas de la Persona con id == personaId
   * */

    def getConversacionesDePersona(def personaId) {
        def conversaciones = Conversacion.where {
            persona.id == personaId && borrada == false
        }
    }

    def buscarPersonas(GrailsParameterMap params, def personaId) {
        def sexo = params.sexo
        def sexoBuscado = params.sexoBuscado
        def nacimiento = params.anioNacimiento
        def list = Persona.findAllBySexoAndSexoBuscado(sexo, sexoBuscado)?.findAll {
            persona ->
            persona.fechaNacimiento < nacimiento
        }
        def id = personaId
        def map = new HashMap<Persona, Integer>()
        list.each {
            persona ->
            int puntaje = redNeuronalOriginalService.getAceptableUsuario(id, persona.id)
            map.put(persona, puntaje)
        }
        map.sort {
            a, b ->
            return a.value >= b.value ? 1 : 0
        }
        return map.keySet()
    }

}

